﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace BañosMixtos
{
    class Program
    {
        static int disponibles = 4;
        static string quien = "";
        static object bloqueo = new object();

        static void Main(string[] args)
        {
            Thread v1 = new Thread(Varon);
            Thread v2 = new Thread(Varon);

            Thread m1 = new Thread(Mujer);
            Thread m2 = new Thread(Mujer);

            v1.Start();
            v2.Start();
            m1.Start();
            m2.Start();
            
            Console.Read();
        }

        static void Varon() {
            lock (bloqueo)
            {
                while (!HayEspacio() || Hay("Mujer"))
                {
                    //Console.Write(".");
                }

                Ingresar("Varon");
            }
            Ocupar("Varon");
            Desocupar("Varon");
        }

        private static void Ocupar(string Genero)
        {
            Console.WriteLine("Ocupa");
            Thread.Sleep(1000);
        }

        static void Mujer()
        {
            lock (bloqueo)
            {
                while (!HayEspacio() || Hay("Varon"))
                {
                    //Console.Write(".");
                }

                Ingresar("Mujer");
            }
            Ocupar("Mujer");
            Desocupar("Mujer");
        }        

        private static void Ingresar(string Genero)
        {
            Console.WriteLine("Ingresando " + Genero);
            disponibles = disponibles - 1;
            quien = Genero;
        }

        private static void Desocupar(string Genero)
        {
            Console.WriteLine("Saliendo " + Genero);
            disponibles = disponibles + 1;
            if (disponibles == 4)
                quien = "";
        }

        private static bool Hay(string Genero)
        {
            return quien == Genero;
        }

        private static bool HayEspacio()
        {
            return disponibles > 0;
        }
    }
}
